package com.zf.common.json.config;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

import java.io.IOException;
import java.util.Objects;


/**
 * 自定义Json序列化器：
 * 针对 PageInfo 类中的属性特殊处理.
 * <pre>{@code
 * 使用方式：
 * 1、在 PageInfo 类上使用 @JsonSerialize(using = MyPageInfoSerializer.class);
 * 2、或者在 Jackson 的 ObjectMapper 的配置类中全局配置：
 *      builder.serializerByType(PageInfo.class, MyPageInfoSerializer.instance);
 *      或
 *      module.addSerializer(PageInfo.class, MyPageInfoSerializer.instance);
 * }
 * </pre>
 */
public class MyPageInfoSerializer extends JsonSerializer<PageInfo> {

    public static final MyPageInfoSerializer instance = new MyPageInfoSerializer();


    /**
     * 对 PageInfo 类中的 Long/long 属性序列化为数字，其他类中的Long属性按照全局配置序化
     */
    @Override
    public void serialize(PageInfo pageInfo, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {

        jsonGenerator.writeStartObject();

        // 对 PageInfo 类中的 Long 属性序列化为数字，其他类中的Long属性按照全局配置序化
        if (Objects.nonNull(pageInfo.getTotalCount())) {
            jsonGenerator.writeNumberField("totalCount", pageInfo.getTotalCount());
        } else {
            jsonGenerator.writeNullField("totalCount");
        }
        jsonGenerator.writeNumberField("currentPageCount", pageInfo.getCurrentPageCount());

        jsonGenerator.writeNumberField("pageSize", pageInfo.getPageSize());
        jsonGenerator.writeNumberField("pageNumber", pageInfo.getPageNumber());

        jsonGenerator.writeEndObject();
    }
}